package br.unirio.octopus.dominio;

import java.util.Date;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * Classe Que representa um jogo
 * 
 * @author Carlos
 * 
 */
@Entity
@Table(name = "jogo")
public class Jogo {

	@Id
	@Column(name = "numero", unique = true, nullable = false)
	private int numeroDoJogo;

	@OneToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "IDPais1")
	private Pais pais1;

	@OneToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "IDPais2")
	private Pais pais2;

	@Column(name = "descricaoPais1", length = 20)
	private String descricaoPais1;

	@Column(name = "descricaoPais2", length = 20)
	private String descricaoPais2;

	@Column(name = "numeroGrupo")
	private int numeroGrupo;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "IDFase")
	private Fase fase;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "IDEstadio")
	private Estadio estadio;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DataHora")
	private Date diaEHorario;

	@Column(name = "GolsPais1")
	private Integer golsPais1;

	@Column(name = "GolsPais2")
	private Integer golsPais2;
	
	@OneToMany(fetch=FetchType.EAGER, mappedBy="jogo")
	private Set<Palpite> palpitesDoJogo;

	// Construtores

	public Jogo(int numeroDoJogo, Pais pais1, Pais pais2,
			String descricaoPais1, String descricaoPais2, int numeroGrupo,
			Fase fase, Estadio estadio, Date diaEHorario, int golsPais1,
			int golsPais2) {
		super();
		this.numeroDoJogo = numeroDoJogo;
		this.pais1 = pais1;
		this.pais2 = pais2;
		this.descricaoPais1 = descricaoPais1;
		this.descricaoPais2 = descricaoPais2;
		this.numeroGrupo = numeroGrupo;
		this.fase = fase;
		this.estadio = estadio;
		this.diaEHorario = diaEHorario;
		this.golsPais1 = golsPais1;
		this.golsPais2 = golsPais2;
	}

	public Jogo() {
		super();
	}

	/* **********************************
	 * Gets/Sets
	 * 
	 * **********************************
	 */

	public int getNumeroDoJogo() {
		return numeroDoJogo;
	}

	public void setNumeroDoJogo(int numeroDoJogo) {
		this.numeroDoJogo = numeroDoJogo;
	}

	public Pais getPais1() {
		return pais1;
	}

	public void setPais1(Pais pais1) {
		this.pais1 = pais1;
	}

	public Pais getPais2() {
		return pais2;
	}

	public void setPais2(Pais pais2) {
		this.pais2 = pais2;
	}

	public String getDescricaoPais1() {
		return descricaoPais1;
	}

	public void setDescricaoPais1(String descricaoPais1) {
		this.descricaoPais1 = descricaoPais1;
	}

	public String getDescricaoPais2() {
		return descricaoPais2;
	}

	public void setDescricaoPais2(String descricaoPais2) {
		this.descricaoPais2 = descricaoPais2;
	}

	public int getNumeroGrupo() {
		return numeroGrupo;
	}

	public void setNumeroGrupo(int numeroGrupo) {
		this.numeroGrupo = numeroGrupo;
	}

	public Fase getFase() {
		return fase;
	}

	public void setFase(Fase fase) {
		this.fase = fase;
	}

	public Estadio getEstadio() {
		return estadio;
	}

	public void setEstadio(Estadio estadio) {
		this.estadio = estadio;
	}

	public Date getDiaEHorario() {
		return diaEHorario;
	}

	public void setDiaEHorario(Date diaEHorario) {
		this.diaEHorario = diaEHorario;
	}
	
	public Integer getGolsPais1() {
		return golsPais1;
	}

	public void setGolsPais1(Integer golsPais1) {
		this.golsPais1 = golsPais1;
	}

	public Integer getGolsPais2() {
		return golsPais2;
	}

	public void setGolsPais2(Integer golsPais2) {
		this.golsPais2 = golsPais2;
	}

	public Set<Palpite> getPalpitesDoJogo() {
		return palpitesDoJogo;
	}

	public void setPalpitesDoJogo(Set<Palpite> palpitesDoJogo) {
		this.palpitesDoJogo = palpitesDoJogo;
	}

	@Override
	public boolean equals(Object obj) {
		if(obj!=null){
			if(obj instanceof Jogo){
				Jogo jogo = (Jogo) obj;
				if(jogo.getNumeroDoJogo()==this.numeroDoJogo){
					return true;
				}
			}			
		}
		return false;
	}

	public Pais getVencedor()
	{
		if (golsPais1 > golsPais2)
		{
			return pais1;
		}
		else
		{
			return pais2;
		}
	}
	
	public Pais getPerdedor()
	{
		if (golsPais1 > golsPais2)
		{
			return pais2;
		}
		else
		{
			return pais1;
		}
	}

}
